package com.sc.server.member.exception;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yuantongqin
 * desc:
 * 2020-08-11
 */
@Data
public class CcResult<T> {

    public String message;


    private T body;


    public enum StatusEnum {SUCCESS, REFUSED, FAILED}

    public static final String CODE_SUCCESS = "201";
    public static final String CODE_REFUSED = "203";
    public static final String CODE_FAILED = "205";

//    @ApiModelProperty("状态：SUCCESS 代表成功 | REFUSED 代表拒绝 | FAILED 代表异常")
    private StatusEnum status = StatusEnum.SUCCESS;

//    @ApiModelProperty("状态码：201 成功|203 拒绝|205 失败")
    private String code = CODE_SUCCESS;

//    @ApiModelProperty("异常信息")
    private ExceptionInfo exception;

//    @ApiModelProperty("校验错误-列表")
    private List<FieldErrorInfo> validationErrorList = new ArrayList<>();

//    @ApiModelProperty("总记录函数")
    private Long totalCount;

    /**
     * 标记服务拒绝处理(由于验证失败等原因.)
     */
    public void markSuccess() {
        clear();
        this.code = CODE_SUCCESS;
        this.status = StatusEnum.SUCCESS;
    }

    /**
     * 标记服务拒绝处理(由于验证失败等原因.)
     */
    public void markRefused() {
        clear();
        this.code = CODE_REFUSED;
        this.status = StatusEnum.REFUSED;
    }


    /**
     * 标记服务的处理结果发生了异常.
     */
    public void markFailed() {
        clear();
        this.code = CODE_FAILED;
        this.status = StatusEnum.FAILED;
    }

    /**
     * 标记为成功
     */
    public void markSuccess(T data) {
        clear();
        this.status = StatusEnum.SUCCESS;
        this.code = CODE_SUCCESS;
        this.body = data;
    }

    /**
     * 标记为拒绝
     */
//    public void markRefused(IExceptionDesc exceptionDesc) {
//        if (exceptionDesc == null) {
//            exceptionDesc = SysExceptionDesc.UNKNOW_ERROR;
//        }
//        markRefused(exceptionDesc.getCode(), exceptionDesc.getMessage());
//    }

    /**
     * 标记为拒绝
     */
    public void markRefused(String code, String message) {
        clear();
        this.status = StatusEnum.REFUSED;
        this.exception = new ExceptionInfo();
//        this.exception.setErrorCode(code);
//        this.exception.setMessage(message);
//        this.exception.setServiceName(MDC.get(ApiConstants.CURRENT_SERVICE_NAME));
//        this.exception.setTraceId(MDC.get(ApiConstants.REQUEST_TRACE_ID));
    }

    /**
     * 标记为失败
     */
//    public void markFailed(IExceptionDesc exceptionDesc) {
//        if (exceptionDesc == null) {
//            exceptionDesc = SysExceptionDesc.UNKNOW_ERROR;
//        }
//        markFailed(exceptionDesc.getCode(), exceptionDesc.getMessage());
//    }

    /**
     * 标记为失败
     *
     * @param code
     * @param message
     */
    public void markFailed(String code, String message) {
        clear();
        this.status = StatusEnum.FAILED;
        this.code = CODE_FAILED;
        this.exception = new ExceptionInfo();
//        this.exception.setErrorCode(code);
//        this.exception.setMessage(message);
//        this.exception.setServiceName(MDC.get(ApiConstants.CURRENT_SERVICE_NAME));
//        this.exception.setTraceId(MDC.get(ApiConstants.REQUEST_TRACE_ID));
    }

    /**
     * 自定义错误
     *
     * @param code
     * @param message
     */
//    public void customizeError(String code, String message, String serviceName) {
//        this.exception = new ExceptionInfo();
//        this.exception.setErrorCode(code);
//        this.exception.setMessage(message);
//        this.exception.setServiceName(serviceName);
//        this.exception.setTraceId(MDC.get(ApiConstants.REQUEST_TRACE_ID));
//    }


    /**
     * 清除
     */
    public void clear() {
        this.exception = null;
        this.body = null;
        this.status = null;
        this.code = null;
    }
//
//    /**
//     * 衍生出一个
//     */
//    public <T> ApiResult<T> derive() {
//        ApiResult<T> apiResult = new ApiResult<>();
//        BeanUtils.copyProperties(this, apiResult);
//        return apiResult;
//    }
//
//    /**
//     * 返回失败的apiResult
//     *
//     * @return
//     */
//    public static ApiResult doFailed(IExceptionDesc exceptionDesc) {
//        ApiResult isbResult = new ApiResult();
//        isbResult.markFailed(exceptionDesc);
//        return isbResult;
//    }
//
//    /**
//     * 返回失败的result
//     *
//     * @param code
//     * @param message
//     * @return
//     */
//    public static ApiResult doFailed(String code, String message) {
//        ApiResult apiResult = new ApiResult();
//        apiResult.markFailed(code, message);
//        return apiResult;
//    }
//
//    /**
//     * 返回拒绝的apiResult
//     *
//     * @return
//     */
//    public static ApiResult doRefused(IExceptionDesc exceptionDesc) {
//        ApiResult apiResult = new ApiResult();
//        apiResult.markRefused(exceptionDesc);
//        return apiResult;
//    }
//
//    public static ApiResult doRefused(String code, String message) {
//        ApiResult apiResult = new ApiResult();
//        apiResult.markRefused(code, message);
//        return apiResult;
//    }
//
//    /**
//     * 返回成功的apiResult
//     *
//     * @param data
//     * @param <D>
//     * @return
//     */
//    public static <D> ApiResult<D> doSuccess(D data) {
//        ApiResult apiResult = new ApiResult();
//        apiResult.markSuccess(data);
//        return apiResult;
//    }
//
//    /**
//     * 返回成功的apiResult
//     *
//     * @param data       数据
//     * @param totalCount 总数
//     * @param <D>        数据类型
//     * @return apiResult
//     */
//    public static <D> ApiResult<D> doSuccess(D data, Long totalCount) {
//        ApiResult<D> apiResult = new ApiResult<>();
//        apiResult.markSuccess(data);
//        apiResult.setTotalCount(totalCount);
//        return apiResult;
//    }

}
